package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.NoSuchElementException;

import org.sysdance.aplicativo.entidade.AlunoTurmaCurso;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.AlunoTurmaCursoIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.ResultSetUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;

public class AlunoTurmaCursoDAO implements AlunoTurmaCursoIntegracao {

	@Override
	public void inserirAlunoTurmaCurso(AlunoTurmaCurso alunoTurmaCurso) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO aluno_turma_curso(id_aluno_turma_curso, id_aluno, id_curso, id_turma, qtd_parcelas ,dt_venc_primeira_parc) ");
        sql.append("VALUES (NEXTVAL('aluno_turma_curso_id_aluno_turma_curso_seq'), ?, ?, ?, ?,?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString(),new String[]{"id_aluno_turma_curso"});
            ps.setInt(1,alunoTurmaCurso.getAluno().getIdAluno());
            ps.setInt(2, alunoTurmaCurso.getCurso().getIdCurso());
            ps.setInt(3, alunoTurmaCurso.getTurma().getIdTurma());
            ps.setInt(4, alunoTurmaCurso.getQtdParcelas());
            ps.setDate(5, new Date(alunoTurmaCurso.getDtVencPrimeiraParc().getTime()));
            ps.executeUpdate();
            ResultSet rsKeys = ps.getGeneratedKeys();
            if(rsKeys.next()){
            	alunoTurmaCurso.setIdAlunoTurmaCurso(rsKeys.getInt(rsKeys.getMetaData().getColumnName(1)));
            }
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}

	@Override
	public AlunoTurmaCurso consultarPorIdCursoTurmaAluno(AlunoTurmaCurso filtro) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM aluno_turma_curso ");
        sql.append("WHERE id_aluno = ? AND id_curso=? AND id_turma=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, filtro.getAluno().getIdAluno());
            ps.setInt(2, filtro.getCurso().getIdCurso());
            ps.setInt(3, filtro.getTurma().getIdTurma());
            final ResultSet rs = ps.executeQuery();
            return ResultSetUtil.extrairUnicoRegistro(rs, AlunoTurmaCurso.class);
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            return null;
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            return null;
        } catch (final NoSuchElementException n) {
            SysDanceUtil.getInstancia().imprimirLog(n);
            return null;
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}
	
	@Override
	public Boolean isExisteAlunoTurmaCurso(AlunoTurmaCurso alunoTurmaCurso) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT id_aluno, id_curso, id_turma ");
        sql.append("FROM aluno_turma_curso ");
        sql.append("WHERE id_aluno=? AND id_curso=? AND id_turma=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoTurmaCurso.getAluno().getIdAluno());
            ps.setInt(2, alunoTurmaCurso.getCurso().getIdCurso());
            ps.setInt(3, alunoTurmaCurso.getTurma().getIdTurma());
            return ps.executeQuery().next();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return Boolean.FALSE;
	}
}
